home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
libs
/
3dvect39
/
main.asm
< prev
next >
Wrap
Assembly Source File
|
1994-10-30
|
43KB
|
1,233 lines
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;
; Filename : Main.asm
; Included from: Main Assembley Module
; Description : Main demo of 3dvector library
;
; Written by: John McCarthy
; 1316 Redwood Lane
; Pickering, Ontario.
; Canada, Earth, Milky Way (for those out-of-towners)
; L1X 1C5
;
; Internet/Usenet: BRIAN.MCCARTHY@CANREM.COM
; Fidonet: Brian McCarthy 1:229/15
; RIME/Relaynet: ->CRS
;
; Home phone, (905) 831-1944, don't call at 2 am eh!
;
; Send me your protected mode source code!
; Send me your Objects!
; But most of all, Send me a postcard!!!!
;
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
.386p
jumps
code32 segment para public use32
assume cs:code32, ds:code32
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; define externals
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
include pmode.ext ; protected mode externals
include xmouse.ext ; xmode mouse externals
include xmode.ext ; xmode externals by matt pritchard
include 3d.ext
include irq.ext
include stars.ext
include font.ext
include file.ext
include land.ext
include argc.ext
include joystick.ext
include fade.ext
include kb.ext
include function.ext
include clear.ext
include gus.ext
include fx.ext
include macros.inc
include equ.inc
include sphere.inc
include palette.inc ; palette
include objects.inc ; table of shapes/colours
include stone0.inc
include stone1.inc
include stone2.inc
include stone3.inc
include stone4.inc
include stone5.inc
include stone6.inc
include stone7.inc
include stone8.inc
include stone9.inc
include stonea.inc
include stoneb.inc
include stonec.inc
include stoned.inc
include stonee.inc
include stonef.inc
include font0.inc ; font 0
include font1.inc ; font 0
include font2.inc ; font length tables
include explode.ext
include loadgif.ext
include dump.glz
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; code
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
giffile db "main.gif",0
giffile2 db "target.gif",0
public _main
_main:
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; get enviornment: current directory, current file
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
sti
call _setup_env ; set up file envirionment (eg c:\temp\thisprog.exe )
call _initkb
mov eax,_lomembase
mov _filebufloc,eax
mov _filebuflen,4000h
add _lomembase,4000h
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; sound effects stuff
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;call _sfx_find
;mov edx,_lomembase ; DMA buffer * all this data is ignored *
;mov ebx, 1024 ; DMA buffer size * if the user has a GUS *
;mov ecx, 22000 ; sample rate
;mov eax,_lomembase
;add eax, ebx ; samples are right after DMA buffer
;call _sfx_init ; call this for both soundcards
;imul ebx,14042 ; 14042 bytes of sample memory required (0 if GUS)
;add _lomembase,eax ; bump up low memory because of DMA (0 if GUS)
;add _lomembase,ebx ; bump up low memory because of samples required (0 if GUS)
;mov edi,offset soundname ; list of sound effects to load...
;mov edx,_lomembase
;call _load_sams
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; check for and load 669 - link with argc,kb,gsp669,gs
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; get timer IRQ running
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _irq_setpmirq ; set irq running - must be done at start for palette fading
mov ax, 21694 ; 1193180/(55 frames a second)
call _irq_set_timer
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; explode DOS palette to common colour
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
mov eax,00003f00h ; what color to fade to
mov bh,12 ; how much to fade each pel
mov bl,255 ; how often should i fade the palette
;call _fade_all ; fade it...
;call _wait_for_fade
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; fade palette to black
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
mov eax,00000000h ; what color to fade to
mov bh,1 ; how much to fade each pel
mov bl,120 ; how often should i fade the palette
;call _fade_all ; fade it...
;call _wait_for_fade
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; set xmode
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
pushw xmode
pushw xactual
pushw yactual
pushw pages
call _set_vga_modex
cmp ax,-1 ; test for error in setting videomode
jne getout
pushw 1
call _set_active_page
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; wipe palette after xmode call ('cause INT 10h resets the palette)
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
mov eax,00000000h
call _wipeoffpalette
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; set up pointers to object shape data
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call setupbase
call _joy_calibratejoystick
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; initialize xmode page flipping, font style, and get mouse ready
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
mov esi,o _font0
mov edi,o _font1
mov ebp,o _fontlength
call _initfont
;pushw 150
;pushw 150
;push offset ex3
;push offset mousesavemap
;pushw 0
;pushw xactual
;pushw 0
;pushw yactual
;call _show_mouse
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; draw borders, title, and cosmetic screen stuff
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
mov esi,o runscreen ; this uses the font.asm setup routines
;call _fnt_tstring
mov esi,o runtext
;call _fnt_tstring
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; use IRQ to fade palette on
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
mov esi,o gamecolr
mov bh,1
mov bl,180
call _fade_palette_read
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; set clipping paramters (already done, but this shows how set new parameters)
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
mov ax,xmin
mov bx,ymin
mov cx,xmax
mov dx,ymax
;call _set_clip_absolute
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; set clipping parameters, (these are already set on startup so this isnt really needed)
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
mov ax,xmin
mov bx,ymin
mov cx,xmax
mov dx,ymax
mov si,_xcenter
mov di,_ycenter
;call _set_clip_offset
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; initialize the _bitmaps: remember first two words are x and y size
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
mov _bitbase[0*4],offset sphere
mov _bitx[0*4],30
mov _bity[0*4],30
mov _stonetbl[0*4],o headerf ; stone texture table (second half), 16 shades spread over 32
mov _stonetbl[1*4],o headerf
mov _stonetbl[2*4],o headere
mov _stonetbl[3*4],o headere
mov _stonetbl[4*4],o headerd
mov _stonetbl[5*4],o headerd
mov _stonetbl[6*4],o headerc
mov _stonetbl[7*4],o headerc
mov _stonetbl[8*4],o headerb
mov _stonetbl[9*4],o headerb
mov _stonetbl[10*4],o headera
mov _stonetbl[11*4],o headera
mov _stonetbl[12*4],o header9
mov _stonetbl[13*4],o header9
mov _stonetbl[14*4],o header8
mov _stonetbl[15*4],o header8
mov _stonetbl[16*4],o header7
mov _stonetbl[17*4],o header7
mov _stonetbl[18*4],o header6
mov _stonetbl[19*4],o header6
mov _stonetbl[20*4],o header5
mov _stonetbl[21*4],o header5
mov _stonetbl[22*4],o header4
mov _stonetbl[23*4],o header4
mov _stonetbl[24*4],o header3
mov _stonetbl[25*4],o header3
mov _stonetbl[26*4],o header2
mov _stonetbl[27*4],o header2
mov _stonetbl[28*4],o header1
mov _stonetbl[29*4],o header1
mov _stonetbl[30*4],o header0
mov _stonetbl[31*4],o header0
mov _xreftable[32*4],offset xref0 ; glenz vector cross referancing tables
mov _xreftable[33*4],offset xref0
mov _xreftable[34*4],offset xref1
mov _xreftable[35*4],offset xref1
mov _xreftable[36*4],offset xref2
mov _xreftable[37*4],offset xref2
mov _xreftable[38*4],offset xref3
mov _xreftable[39*4],offset xref3
mov _xreftable[40*4],offset xref4
mov _xreftable[41*4],offset xref4
mov _xreftable[42*4],offset xref5
mov _xreftable[43*4],offset xref5
mov _xreftable[44*4],offset xref6
mov _xreftable[45*4],offset xref6
mov _xreftable[46*4],offset xref7
mov _xreftable[47*4],offset xref7
mov _xreftable[48*4],offset xref8
mov _xreftable[49*4],offset xref8
mov _xreftable[50*4],offset xref9
mov _xreftable[51*4],offset xref9
mov _xreftable[52*4],offset xref10
mov _xreftable[53*4],offset xref10
mov _xreftable[54*4],offset xref11
mov _xreftable[55*4],offset xref11
mov _xreftable[56*4],offset xref12
mov _xreftable[57*4],offset xref12
mov _xreftable[58*4],offset xref13
mov _xreftable[59*4],offset xref13
mov _xreftable[60*4],offset xref14
mov _xreftable[61*4],offset xref14
mov _xreftable[62*4],offset xref15
mov _xreftable[63*4],offset xref15
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; plop some objects in space
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; camera location/angle
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
mov esi,cameraobject ; set the camera position
mov bx,0 ; camera angle
mov cx,-16384
mov bp,0
call _set_angle
mov ebx,1350000 ; camera position
mov ecx,20000
mov ebp,-15000
call _put_object
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; cube
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _search_next_available_object ; return si as next available object (1)
call _init_object
mov ebx, 110000 ; to this position (x,y,z)=ebx,ecx,ebp
mov ecx,250000 ; locations are 32 bit
mov ebp,-700000
call _put_object ; plop..
mov bx,0 ; angles are 16 bit
mov cx,0
mov bp,0
call _set_angle ; duhhh...i wonder what this call does...
call _set_object_on ; turn object si on (make visible)
call _use_full_rotations ; full rotations for this object (0)
mov _userotate[esi],0 ; full rotations for this object (0)
mov ax,0
call _set_shape ; set object si to shape ax
mov ebx,000545100h ; x,y,z angular velocities
mov ecx,000a91500h ; high word = number of turns/revolutions
mov ebp,000342300h ; lo word = final angle (position)
mov di,58000 ; di = time to twist there (total frames)
call _twist_si ; set angular velocity
call _set_xyzvadds
mov bl,0 ; set cross referencing palette (null)
call _set_xref_palette
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; wireframe cube
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _search_next_available_object
call _init_object
mov ebx,230000
mov ecx,20000
mov ebp,190000
call _put_object
mov bx,0
mov cx,0
mov bp,0
call _set_angle
call _set_object_on
call _use_full_rotations ; full rotations for this object (0)
mov ax,1
call _set_shape
mov ebx,000500000h
mov ecx,000200000h
mov ebp,000300000h
mov di,65500
call _twist_si
call _set_xyzvadds
mov bl,0
call _set_xref_palette
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; ring
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _search_next_available_object
call _init_object
mov ebx,80000
mov ecx,170000
mov ebp,160000
call _put_object
mov bx,0
mov cx,0
mov bp,0
call _set_angle
call _set_object_on
call _use_full_rotations ; full rotations for this object (0)
mov ax,2
call _set_shape
mov ebx,000310124h
mov ecx,0ffbc2340h
mov ebp,000530100h
mov di,16000
call _twist_si
call _set_xyzvadds
mov bl,0
call _set_xref_palette
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; diamond
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _search_next_available_object
call _init_object
mov ebx,160000
mov ecx,-200000
mov ebp,-80000
call _put_object
mov bx,0
mov cx,0
mov bp,0
call _set_angle
call _set_object_on
call _use_full_rotations ; full rotations for this object (0)
mov ax,3
call _set_shape
mov ebx,000600000h
mov ecx,0fff23400h
mov ebp,000100000h
mov di,21000
call _twist_si
call _set_xyzvadds
mov bl,0
call _set_xref_palette
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; rubine (flat diamond)
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _search_next_available_object
call _init_object
mov ebx,-19000
mov ecx,19000
mov ebp,-240000
call _put_object
mov bx,0
mov cx,0
mov bp,0
call _set_angle
call _set_object_on
call _use_full_rotations ; full rotations for this object (0)
mov ax,4
call _set_shape
mov ebx,000200000h
mov ecx,000100000h
mov ebp,0ffa00000h
mov di,12000
call _twist_si
call _set_xyzvadds
mov bl,0
call _set_xref_palette
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; vectorball cube thingy
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _search_next_available_object ; this next object is the bitmaped cube
call _init_object
mov ebx,-150000 ; remove this and see the speed of
mov ecx,-190000 ; only vectors
mov ebp,120000
call _put_object ; note: the _bitmaps take a lot of cpu time
mov bx,0
mov cx,0
mov bp,0
call _set_angle
call _set_object_on
call _use_full_rotations ; full rotations for this object (0)
mov ax,5
call _set_shape
mov ebx,000300000h
mov ecx,000700000h
mov ebp,000500000h
mov di,13000
call _twist_si
call _set_xyzvadds
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; stand alone _bitmap
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _search_next_available_object ; stand alone bitmap - good for smoke or
call _init_object
mov ebx,-5000 ; explosions
mov ecx,5000
mov ebp,25000
call _put_object ; set location
call _set_object_on ; turn it on
mov ax,0 ; zeroth _bitmap is shape
call _set_shape ; will load from _bitbase[0]
call _set_to_hi_bitmap ; it's a bitmap...
mov bx,500 ; _bitmap scaling (gets added to _bitx and _bity)
mov cx,500 ; _bitmap scaling bx=x scaling, cx=y scaling
call _set_bitmap_scaling
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; this is the body of those wierd three blocks
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _search_next_available_object
call _init_object
mov ebx,-190000
mov ecx,-280000
mov ebp,-140000
call _put_object
mov bx,0
mov cx,0
mov bp,0
call _set_angle
call _set_object_on
call _use_full_rotations
mov ax,6
call _set_shape
mov ebx,000600000h
mov ecx,0fff23400h
mov ebp,000200000h
mov di,16000
call _twist_si
call _set_xyzvadds
mov bl,0
call _set_xref_palette
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; this defines one "arm" of that wierd block - remember, it is "attached" to the body above
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
inc esi
call _init_object
mov ebx,0/256 ; this is not an actual object, it is only
mov ecx,0/256 ; a reference to where the arm will get
mov ebp,0/256 ; the angle data from.
call _put_object ; _put_object sets location of arm relative to body
mov bx,0
mov cx,0
mov bp,0
call _set_angle ; set initial angle of arm (relative to body)
call _set_object_off
call _set_sub_object_on
call _use_full_rotations ; full = rotation is relative to body , no = arm angle is not relative to body
;mov ax,xx ; arm shape is already defined in block above
;call _set_shape
mov ebx,000200000h ; set anglular velocity of arm (relative to body)
mov ecx,000600000h
mov ebp,000120000h
mov di,22000
call _twist_si
call _set_xyzvadds
mov bl,0 ; not an object, just angle and location data
call _set_xref_palette ; so we dont need this
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; this defines the other "arm"
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
inc esi
call _init_object
mov ebx,0/256 ; the locations of sub_objects are /256 because of the way
mov ecx,0/256 ; conversion between real space co-ordinates and object
mov ebp,0/256 ; co-ordinates are calculated. objects are 256 times larger than their appearance in real space
call _put_object ; this is because there is greater accuracy in real space!!
mov bx,0
mov cx,0
mov bp,0
call _set_angle
call _set_object_off
call _set_sub_object_on
call _use_full_rotations ; full = rotation is relative to body , no = arm angle is not relative to body
;mov ax,xx
;call _set_shape
mov ebx,000220000h
mov ecx,0ff700000h
mov ebp,0ffe30000h
mov di,18000
call _twist_si
call _set_xyzvadds
mov bl,0
call _set_xref_palette
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; get objects moving
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _irq_findcontrol
mov _irqcontrol[ecx*4],o _updvectors
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; make camera _rotate_point along z axis if you want - make sure equ.inc has "use_z equ yes"
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;mov _eyezadds,50 ; make the camera _rotate_point along it's z axis (just for fun)
;mov esi,cameraobject
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; reset IRQ counter before animation begins
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _irq_resetrastercount ; done before any animation loop!!!
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; intialize 3d pointers\indexers\sortvalues
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _init_tables ; initialize 3d vector stuff
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; example of how to point an object toward another object in a certin time
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;mov esi,5 ; an example of how to use _point_time
;mov ebx,-10000 ; si = obj, bx,cx,bp = location, di = time
;mov ecx,-30000
;mov ebp,90000
;mov edi,150
;call _point_time
call _irq_findcontrol
mov _irqcontrol[ecx*4],offset _handle_explosions
mov ebp,_himembase
mov dl,0
call _compile_background_dl
mov clearroutine,ebp
mov cc3, edi
jmp jjjjj
clearroutine dd 0
cc2 dd offset _ret
cc3 dd 0
jjjjj:
mov _himembase,edi
mov edx,offset giffile
call _openfile
jc nogif
mov edx,_lomembase
mov ecx,_lomembase
add edx,8000h
mov eax,offset _readfile
call _loadgif
if yactual lt 400
call _gif_squeeze_y
endif
;call _gif_squeeze_y
;call _gif_squeeze_x
call _closefile
push edx
push edx
push edx
pushw 0
pushw 0
call _draw_bitmap
call _flip_page
pushw 0
pushw 0
call _draw_bitmap
pop eax
mov bx,0
mov cx,0
mov dl,0
mov ebp,cc3
call _compile_foreground
mov cc2,ebp
mov _himembase,edi
nogif:
mov edx,offset giffile2
call _openfile
jc nogif2
mov edx,_lomembase
mov ecx,_himembase
add edx,8000h
mov eax,offset _readfile
call _loadgif
if yactual lt 400
call _gif_squeeze_y
endif
call _closefile
pushw 150
pushw 150
push edx
push offset mousesavemap
pushw 0
pushw xactual
pushw 0
pushw yactual
call _show_mouse
nogif2:
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; THE MAIN LOOP...
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
ieox:
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; point an object toward the camera (just a cheap example)
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;mov esi,0 ; try uncommenting this!, this will point
;mov edi,2
;call _get_displacement
;mov esi,2
;mov ax,_vys[esi*2]
;mov di,_vxs[esi*2]
;call _point_z
;mov esi,2
;mov _vzs[esi*2],ax
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; debugging tool: would you believe some idiot actually called me to tell me I
; needed more debugging tools - I told him he needs to stop
; writing programs with bugs...
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;mov eax,your_problem ; debugging tool mov eax,your_problem ; debugging tool!!!!
;mov _number_eax,eax
;call _put_at_top
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; make sun move around
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;add _y_angle_of_sun,150 ; watch the red ring carefully! the sun will move around the room!
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; make camera respond to joystick
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
joystickobject equ 0
call _joy_cartisianjoystick
neg ebx ; makes the joystick like an airplane...sorta...
shr ebx,5
shr eax,5
mov _vxadds[joystickobject*2],bx
mov _vyadds[joystickobject*2],ax
mov _vzadds[joystickobject*2],0
mov _acountx[joystickobject*2],65000
mov _acounty[joystickobject*2],65000
mov _acountz[joystickobject*2],65000
call _fix_xangle ; make it so user doesn wrap around upside down. (so stars wont mess up)
zapl:
call _joy_justgetbutton
test al,2 ; test if second button pressed
jz dobut2
dec d qqx
and eax,1
xor eax,1
imul eax,18000
mov esi,joystickobject ; move camera...esi - object
mov ebp,eax ; ebp = speed (make it faster!)
mov edi,10 ; edi = total time (not in calculation)
call _set_speed ; move object in direction it is pointing
call _set_xyzadds
jmp contxx
dobut2:
comment %
mov edx,offset _explode_main0
mov ebx,110000 ; x,y,z of explosion
mov ecx,25000
mov ebp,-700000
mov esi,0 ; scaling
mov edi,0
call _start_explosion
jc contxx
push esi
mov _xadds[esi*4],05000
mov _zadds[esi*4],20000
mov _lcount[esi*2],300
mov edx,offset _explode_small
mov ebx,180000 ; x,y,z of explosion
mov ecx,85000
mov ebp,-600000
mov esi,0 ; scaling
mov edi,0
call _start_explosion
pop esi
xor eax,randomnumber
xor eax,edx
xchg al,ah
add eax,0cd9c9a8fh
xor eax,esi
add eax,edi
xor eax,0526dafb2h
add eax,ecx
xor eax,ebx
add eax,ebp
mov randomnumber,eax
in al,64
shl eax,8
in al,65
shl eax,8
in al,64
shl eax,8
in al,64
add randomnumber,eax
mov ecx,randomnumber
call _get_location
call _subtract_camera
call _determine_volume
call _determine_panning
mov ax,0
mov dl,0
mov cl,0
and ch,7
mov ch,30
call _play_sample
jmp contxx
randomnumber dd 5fe6c809h
%
and eax,2
shr eax,1
xor eax,1
imul eax,-18000 ; if button 2 pressed, move camera backwards
mov esi,joystickobject ; move camera...esi - object
mov ebp,eax ; ebp = speed (make it faster!)
mov edi,10 ; edi = total time (not in calculation)
call _set_speed ; move object in direction it is pointing
call _set_xyzadds
contxx:
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; set camera rotation matrix - done once per frame so other routines know how to plot objects
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _copy_virtual_objects
call _setsincose ; set rotation multipliers for eye
;call _land_draw ; draw background landscape
mov edi,_current_page
call clearroutine
;call _clearfill ; clear video memory before plot
;mov esi,1
;mov edi,50000
;mov ebp,9200
;call _set_speed
;call _set_xyzadds
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; plot the stars in the _background
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _star_plot ; plot background stars
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; plot all objects on screen
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _makeobjs ; plot all objects in sides table
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; plot mouse on screen - only a 1 page mouse so it flickers on two pages
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; call _instant_mouse ; plot mouse on screen
; call _plot_mouse
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; show how long it took to draw that last screen
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
;mov eax,_irq_tracespast ; show number of traces past per re-draw
;mov _number_eax,eax
;call _put_at_top
mov edi,_current_page
mov al,1
call cc2
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; show user the new screen
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _flip_page ; flip video pages
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; test escape key - if none, return to top of main loop
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
in al,60h ; test keyboard
cmp al,1
jne ieox
ieo_x2:
in al,60h ; test keyboard
cmp al,1
je ieo_x2
getout:
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; make endpage screen
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
mov eax,0
mov bh,3
mov bl,200
call _fade_all
;call _wait_for_fade
call _mode03
mov eax,0
call _wipeoffpalette
mov edx,offset endtext
call _putdosmsg
mov esi,o _default_palette
mov bh,3
mov bl,255
call _fade_palette_read
call _wait_for_fade
call _resetkb
call _irq_resetpmirq ; reset irq vectors
call _sfx_uninit ; done, clear soundcard
jmp _exit
qqx dd 400
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; sample routines to show how to use some routines
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
comment %
push offset gamecolr
pushw 0
pushw 255
pushw 1
call _load_dac_registers
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
mov esi,04 ; esi = object
mov edi,55 ; edi = time to get there (# of frames)
call _cam_newfollow
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
mov ebx,x
mov ecx,y
mov ebp,z
mov edi,time
mov esi,cameraobject
call _move_si
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
block 0,0,319,399,14
call _flip_page
block 0,0,319,399,14
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
call _flip_page ; example of how to draw a single polygon
p1x equ -50
p1y equ -50
p2x equ -90
p2y equ 70
p3x equ 60
p3y equ 80
mov _x1,p1x
mov _y1,p1y
mov _x2,p2x
mov _y2,p2y
call _fakeline_horz
mov _x1,p2x
mov _y1,p2y
mov _x2,p3x
mov _y2,p3y
call _fakeline_horz
mov _x1,p3x
mov _y1,p3y
mov _x2,p1x
mov _y2,p1y
call _fakeline_horz
mov _colq,7
mov steel,-1
call _polyfill
call _flip_page
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
mov si,6 ; move cube around...si - object
mov ebp,45000 ; ebp = speed (make it faster!)
mov di,600 ; di = total time (not in calculation)
call _set_speed ; move object in direction it is pointing
call _set_xyzadds
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
%
gtab db 010h,011h,012h,013h,014h,015h,016h,017h
db 018h,019h,01ah,01bh,01ch,01dh,01eh,01fh
db 011h,012h,013h,014h,015h,016h,017h,018h
db 019h,01ah,01bh,01ch,01dh,01eh,01fh,01fh
db 010h,011h,012h,013h,014h,015h,016h,017h
db 018h,019h,01ah,01bh,01ch,01dh,01eh,01fh
db 010h,011h,012h,013h,014h,015h,016h,017h
db 018h,019h,01ah,01bh,01ch,01dh,01eh,01fh
db 010h,011h,012h,013h,014h,015h,016h,017h
db 018h,019h,01ah,01bh,01ch,01dh,01eh,01fh
db 010h,011h,012h,013h,014h,015h,016h,017h
db 018h,019h,01ah,01bh,01ch,01dh,01eh,01fh
db 010h,011h,012h,013h,014h,015h,016h,017h
db 018h,019h,01ah,01bh,01ch,01dh,01eh,01fh
db 010h,011h,012h,013h,014h,015h,016h,017h
db 018h,019h,01ah,01bh,01ch,01dh,01eh,01fh
db 010h,011h,012h,013h,014h,015h,016h,017h
db 018h,019h,01ah,01bh,01ch,01dh,01eh,01fh
db 010h,011h,012h,013h,014h,015h,016h,017h
db 018h,019h,01ah,01bh,01ch,01dh,01eh,01fh
db 010h,011h,012h,013h,014h,015h,016h,017h
db 018h,019h,01ah,01bh,01ch,01dh,01eh,01fh
db 010h,011h,012h,013h,014h,015h,016h,017h
db 018h,019h,01ah,01bh,01ch,01dh,01eh,01fh
db 010h,011h,012h,013h,014h,015h,016h,017h
db 018h,019h,01ah,01bh,01ch,01dh,01eh,01fh
db 010h,011h,012h,013h,014h,015h,016h,017h
db 018h,019h,01ah,01bh,01ch,01dh,01eh,01fh
db 010h,011h,012h,013h,014h,015h,016h,017h
db 018h,019h,01ah,01bh,01ch,01dh,01eh,01fh
db 010h,011h,012h,013h,014h,015h,016h,017h
db 018h,019h,01ah,01bh,01ch,01dh,01eh,01fh
public _putdosmsg
_putdosmsg:
push ax
push edx
add edx,_code32a
mov al,dl
and ax,0fh
shr edx,4
mov v86r_ds,dx
mov v86r_dx,ax
mov v86r_ah,9
mov al,21h
int 33h
pop edx
pop ax
ret
hextbl db '0123456789ABCDEF'
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Put 8 digit hex number to screen buffer
; In:
; EAX - number to put
; EDI -> screen buffer location to put at
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_puthexnum:
push eax ebx ecx edx edi
mov ebx,offset hextbl
mov edx,eax
mov ecx,8
mov ah,0fh
puthexnuml0:
rol edx,4
mov al,dl
and al,0fh
xlat
stosw
loop puthexnuml0
pop edi edx ecx ebx eax
ret
wipe_v_memory:
rlp edi,0a0000h ; wipe video memory
mov ecx,320*200*4/4/4
xor eax,eax
rep stosd
ret
endtext db "Doesn't that red diamond look great!",13,10
db 13,10
db "John McCarthy tries to be a regular on Digital Pixel: (416) 298-1487",13,10
db " and on the Toronto VR SIG: (416) 631-6625",13,10
db 13,10
db "Or write to this address:",13,10
db 13,10
db " John McCarthy",13,10
db " 1316 Redwood Lane",13,10
db " Pickering, Ontario.",13,10
db " Canada, Earth, Milky Way. (for those out-of-towners)",13,10
db " L1X 1C5",13,10
db "$"
; screen text for font routines
runscreen:
border 0,0,xactual-1,yactual-1,16*3
steelbox 3,3,xactual-1-3,yactual-1-3,16*3,28
hole xmin+_xcenter-2,ymin+_ycenter-2,xmax+_xcenter+1,ymax+_ycenter+1,16*3
fillarea xmin+_xcenter,ymin+_ycenter,xmax+_xcenter-1,ymax+_ycenter-1,0
textend
runtext:
newtext 35,13,14
db "3D Vectors in 320x400 Mode-X"
lowercase
newtext 15,yactual-32,14
db "Vector Routines by John McCarthy"
newtext 11,yactual-22,9
db "X-Mode Routines by Matt Pritchard"
newtext 23,yactual-12,12
db "Protected Mode Header by TRAN"
textend
mc = 208 ; mouse colour block (cyan)
mousebitmap:
dw 9,9 ; 9x9 mouse
db mc+12,mc+12,mc+12,mc+12,mc+12,mc+12,mc+12,mc+12, 0 ; hmmm, I wonder where
db mc+02,mc+10,mc+11,mc+11,mc+11,mc+11,mc+05, 0, 0 ; this mouse image came
db mc+01,mc+08,mc+11,mc+11,mc+11,mc+06, 0, 0, 0 ; from?...sorry guys..
db mc+00,mc+07,mc+11,mc+11,mc+11,mc+11,mc+12, 0, 0
db mc+00,mc+05,mc+11,mc+06,mc+11,mc+11,mc+11,mc+12, 0
db mc+00,mc+04,mc+03,mc+00,mc+03,mc+11,mc+11,mc+11,mc+12
db mc+00,mc+02,mc+00, 0,mc+00,mc+03,mc+09,mc+05,mc+01
db mc+00,mc+00, 0, 0, 0,mc+00,mc+03,mc+01, 0
db 0, 0, 0, 0, 0, 0,mc+00, 0, 0
mousesavemap:
db 64*64+4 dup (0)
;mousebitmap:
; dw mousewidth,mouseheight
; db 9,9,9,9,9,0 ; simple 6x6 mouse
; db 9,9,9,9,0,0
; db 9,9,9,9,0,0
; db 9,9,9,9,9,0
; db 9,0,0,9,9,9
; db 0,0,0,0,9,0
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
; Relate point to look and and "sky" point to X,Y and Z angles
; In:
; EBX = x point to look at
; ECX = y point to look at
; EBP = z point to look at
; EAX = x "sky" point
; EDX = y "sky" point
; EDI = z "sky" point
; ESI = object to obtain angles from
; Out:
; Angles for object ESI modified!
;░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
_rel_point:
push esi eax edx edi esi
call _inverse_rotate
call _calc_middle
pop esi
mov _vxs[esi*2],ax
mov _vys[esi*2],bx
mov di,ax
mov ax,bx
pop ebp ecx ebx
call _point_z
pop esi
mov _vzs[esi*2],ax
ret
code32 ends
end